<?php

namespace app\admin\model;

use think\Model;

class HuaWeiSmsModel extends Model
{

    /**
     * 发送短信API
     * 该接口用于客户请求短信业务平台向指定用户发送短信。
     * 批量发送短信，支持一次最大1000号码发送，相同短信内容
     * 此接口通用免短信模板（全变量）和有短信模板ID参数
     * @param string $phone;手机号，多个以逗号隔开，字符串
     * @param string $templateParas;有短信模板参数，字符串，多个是以JSON字符串组成；短信模板无参数，此处可为空；免模板时此处是字符串"短信内容"
     * @param string $SignName;签名名称，默认配置文件获取，字符串
     * @param string $templateId;短信模板ID，默认配置文件获取
     * @param string $sender;短信配置,默认配置文件获取  /国内短信或国际/港澳台 短信通道号，签名管理-》通道号
     * @param string $callback_url;短信配置,默认配置文件获取
     * @param int $sendDataLimit;短信配置,默认配置文件获取
     * @param int $is_use_template;是否使用全变量短信模板（免模板）：0为否，1为是
     * @param int $is_send_sms;是否发送短信 0否(模拟发送，实际不发送短信)，1是
     * @param string $extend;扩展参数，在状态报告中会原样返回
     * 推广短信发送时间为每日8:00 - 21:00，夜间无法发送，避免用户投诉
     * @return array
     */
    public static function sendHuaWeiYunSms($phone,$templateParas,$SignName="",$templateId='',$sender="",$callback_url="",$is_use_template=1,$is_send_sms=1,$extend="999jin")
    {
        $config=config();
        $conf=[];
        if(isset($config['sms'])&&$config['sms']){
            $conf=$config['sms'];
        }
        //发送华为云短信API接口日志
        $send_hua_wei_yun_sms_api_log=[];
        //日志记录，预先记录下请求数据
        $send_hua_wei_yun_sms_api_log['sms_phone']=$phone;
        $send_hua_wei_yun_sms_api_log['sms_templateParas']=$templateParas;
        $send_hua_wei_yun_sms_api_log['sms_SignName']=$SignName;
        $send_hua_wei_yun_sms_api_log['sms_templateId']=$templateId;
        $send_hua_wei_yun_sms_api_log['sms_sender']=$sender;
        $send_hua_wei_yun_sms_api_log['sms_callback_url']=$callback_url;
        $send_hua_wei_yun_sms_api_log['sms_is_use_template']=$is_use_template;
        $send_hua_wei_yun_sms_api_log['sms_is_send_sms']=$is_send_sms;
        $send_hua_wei_yun_sms_api_log['sms_extend']=$extend;

        if(empty($conf)){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数conf"];
        }
        //获取华为云配置信息
        if(empty($conf['hua_wei_sms_channel'])||isset($conf['hua_wei_sms_channel'])&&!$conf['hua_wei_sms_channel']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数hua_wei_sms_channel"];
        }
        $hua_wei_sms_channel=$conf['hua_wei_sms_channel'];
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_channel_conf']=$hua_wei_sms_channel;//配置文件的华为云短信通道配置参数
        //获取华为云各个商户号的短信配置信息
        // app_key
        if(empty($hua_wei_sms_channel['app_key'])||isset($hua_wei_sms_channel['app_key'])&&!$hua_wei_sms_channel['app_key']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_key"];
        }
        $APP_Key=$hua_wei_sms_channel['app_key'];
        // app_secret
        if(empty($hua_wei_sms_channel['app_secret'])||isset($hua_wei_sms_channel['app_secret'])&&!$hua_wei_sms_channel['app_secret']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_secret"];
        }
        $APP_Secret=$hua_wei_sms_channel['app_secret'];
        // app_url
        if(empty($hua_wei_sms_channel['app_url'])||isset($hua_wei_sms_channel['app_url'])&&!$hua_wei_sms_channel['app_url']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_url"];
        }
        // app_url_Batch
        if(empty($hua_wei_sms_channel['app_url_Batch'])||isset($hua_wei_sms_channel['app_url_Batch'])&&!$hua_wei_sms_channel['app_url_Batch']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_url_Batch"];
        }
        $send_url=$hua_wei_sms_channel['app_url'].$hua_wei_sms_channel['app_url_Batch'];
        //发送短信各种参数
        //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
//        $phone = '18124029747,18124024969'; //短信接收人号码，最多支持1000个，多个以英文逗号隔开
        if(empty($phone)){
            return ['code'=>403,'msg'=>"短信号码缺失"];
        }
        $phone_arr=explode(',',$phone);
        if(count($phone_arr)>1000){
            return ['code'=>403,'msg'=>"接口对接API平台短信配置限制最多只能批量发送1000条"];
        }
        $is_repeat_phone=0;//是否有重复的电话号码：0为没有重复的，1为有重复的
        // 获取去掉重复数据的数组
        $unique_arr = array_unique($phone_arr);
        //一个批次发送不能有重复的手机号码，去重
        $phone=implode(',',array_values($unique_arr));
        // 获取重复数据的数组
        $repeat_arr = array_diff_assoc($phone_arr, $unique_arr);
        $repeat_phone_str="";
        if($repeat_arr){
            $repeat_arr=array_values($repeat_arr);
            $repeat_phone_str=implode(',',$repeat_arr);
            $is_repeat_phone=1;
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_is_repeat_phone']=$is_repeat_phone;//是否有重复的电话号码：0为没有重复的，1为有重复的
        $send_hua_wei_yun_sms_api_log['sms_repeat_phone_str']=$repeat_phone_str;//重复手机号码的数据，多个以逗号隔开的字符串
        $send_hua_wei_yun_sms_api_log['sms_phone']=$phone;//不重复手机号码的数据，多个以逗号隔开的字符串
        // 短信模板参数，字符串，多个是以JSON字符串组成，可以支持发送无变量短信模板，此时参数为空
        // 模板变量，此处以单变量验证码短信为例，请客户自行生成6位验证码，并定义为字符串类型，以杜绝首位0丢失的问题（例如：002569变成了2569）。
        if(empty($templateParas)&&$is_use_template){  //全变量模板一定有数据
            return ['code'=>403,'msg'=>"短信模板参数缺失"];
        }
        if($templateParas&&$is_use_template==0){  // 当不是 使用全变量短信模板（免模板）有变量数据的时候，验证下是否JSON字符串数据
            $isJsonBool=self::isJsonBool($templateParas);
            if(empty($isJsonBool)){
                return ['code'=>403,'msg'=>"短信模板参数格式错误"];
            }
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_templateParas']=$templateParas;
        //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称  国际/港澳台短信不用关注该参数
//        $senderName = '中国燃气'; // 签名名称
        if(empty($SignName)){
            if(empty($hua_wei_sms_channel['sms_sign_name'])||isset($hua_wei_sms_channel['sms_sign_name'])&&!$hua_wei_sms_channel['sms_sign_name']){
                return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_sign_name"];
            }
            $SignName=$hua_wei_sms_channel['sms_sign_name'];
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_SignName']=$SignName;
        /**
         * 选填,使用无变量模板时请赋空值 $TEMPLATE_PARAS = '';
         * 单变量模板示例:模板内容为"您的验证码是${1}"时,$TEMPLATE_PARAS可填写为'["369751"]'
         * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,$TEMPLATE_PARAS可填写为'["3","人民公园正门"]'
         * 模板中的每个变量都必须赋值，且取值不能为空
         * 查看更多模板和变量规范:产品介绍>模板和变量规范
         * @var string $TEMPLATE_PARAS
         */
        $body="";
        if($is_use_template){
            //由短信签名和短信内容两部分组成,短信签名必须在短信内容前面,国内短信签名由【】及签名名称组成
            $body = '【' . $SignName . '】' . $templateParas;
            //日志记录
            $send_hua_wei_yun_sms_api_log['sms_content']=$body;
        }else{
            // 使用全变量短信模板（免模板） 无需短信模板ID
//            $templateId = '5429803977644748b83a7b3302640a9f'; //短信模板ID  5429803977644748b83a7b3302640a9f
            if(empty($templateId)){
                if(empty($hua_wei_sms_channel['sms_template_id'])||isset($hua_wei_sms_channel['sms_template_id'])&&!$hua_wei_sms_channel['sms_template_id']){
                    return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_template_id"];
                }
                $templateId=$hua_wei_sms_channel['sms_template_id'];
            }
            //日志记录
            $send_hua_wei_yun_sms_api_log['sms_templateId']=$templateId;
        }
        //国内短信或国际/港澳台 短信通道号，签名管理-》通道号
//        $sender = '8820122408650';
        if(empty($sender)){
            if(empty($hua_wei_sms_channel['sms_sender'])||isset($hua_wei_sms_channel['sms_sender'])&&!$hua_wei_sms_channel['sms_sender']){
                return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_sender"];
            }
            $sender=$hua_wei_sms_channel['sms_sender'];
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_sender']=$sender;
        //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
        // 未设置该字段，则短信平台收到运营商短信中心返回的状态报告不会推送给客户，该状态报告将在短信平台中保存1个小时，超时后系统会自动删除
//        if(empty($callback_url)){
//            if(isset($hua_wei_sms_channel['sms_callback_url'])&&$hua_wei_sms_channel['sms_callback_url']){
//                $callback_url=$hua_wei_sms_channel['sms_callback_url'];
//            }else{
//                return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_callback_url"];
//            }
//        }
        $statusCallback = $callback_url;// http://my.com/receiveSMSReport
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_callback_url']=$statusCallback;
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_extend']=$extend;
        //扩展字段必须携带，不然上下行接口返回数据就会缺少返回字段
//        if(empty($extend)){
//            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_extend"];
//        }
        //模拟发送，实际不发送短信
        if($is_send_sms==0){
            $aliYunRes = ['code'=>200,'data'=>[],'msg'=>'模拟短信发送成功!'];
            return $aliYunRes;
        }
        //请求Headers
        $headers = [
            'Content-Type: application/x-www-form-urlencoded',
            'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"',
            'X-WSSE: ' . self::buildWsseHeader($APP_Key, $APP_Secret)
        ];
        //请求Body
        if($is_use_template){
            $send_data=[
                'from' => $sender,
                'to' => $phone,
                'body' => $body,
                'statusCallback' => $statusCallback,
                'extend' => $extend, //扩展参数，在状态报告中会原样返回
                'signature' => $SignName //使用国内短信通用模板时,必须填写签名名称
            ];
        }else{
            $send_data=[
                'from' => $sender,
                'to' => $phone,
                'templateId' => $templateId,
                'templateParas' => $templateParas,
                'statusCallback' => $statusCallback,
                'extend' => $extend, //扩展参数，在状态报告中会原样返回
                'signature' => $SignName //使用国内短信通用模板时,必须填写签名名称
            ];
        }
        $data = http_build_query($send_data);
        //构造发送请求数据
        $context_options = [
            'http' => [
                'method' => 'POST',
                'header'=> $headers,
                'content' => $data,
                'ignore_errors' => true
            ],
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false
            ] //为防止因HTTPS证书认证失败造成API调用失败，需要先忽略证书信任问题
        ];
        //请求发送数据    print_r($context_options) . PHP_EOL; //打印请求信息
        $response = file_get_contents($send_url, false, stream_context_create($context_options));
        if(empty($response)){
            return ['code'=>403,'msg'=>"短信接口异常，请重试"];
        }
        /**     //发送成功返回如下格式数据
        Array
        (
            [result] => Array
                (
                    [0] => Array
                        (
                            [originTo] => 18124029747
                            [createTime] => 2020-12-30T09:12:46Z
                            [from] => 8820122408650
                            [smsMsgId] => 995c9981-e5cf-425c-b42a-3f50cdbed485_11245726820
                            [status] => 000000
                        )

                    [1] => Array
                        (
                            [originTo] => 18124024969
                            [createTime] => 2020-12-30T09:12:46Z
                            [from] => 8820122408650
                            [smsMsgId] => 995c9981-e5cf-425c-b42a-3f50cdbed485_11245726821
                            [status] => 000000
                        )
                )
            [code] => 000000
            [description] => Success
        )
         */
        try {
            $isJsonBoolResponse=self::isJsonBool($response);
            if(empty($isJsonBoolResponse)){
                return ['code'=>403,'msg'=>"数据格式错误"];
            }
            $response=json_decode($response,true);
            if(isset($response['code'])&&$response['code']=="000000"){
                $aliYunRes = ['code'=>200,'data'=>$response['result'],'msg'=>'接收成功'];
            }else{
                $aliYunRes = ['code'=>403,'data'=>$response,'msg'=>'接收失败'];
            }
            return $aliYunRes;
        } catch (\Exception $e) {
            if($e->getMessage()){
                return ['code'=>403,'msg'=>"短信接口发送异常".$e->getMessage()."，请重试"];
            }else{
                return ['code'=>403,'msg'=>"短信接口发送异常，请重试"];
            }
        }
    }

    /**
     * 发送分批短信API
     * 该接口用于客户请求短信平台向不同用户发送不同的短信。
     * 批量发送短信，支持一次最大1000号码发送，不相同短信内容发送
     * @param string $phone;手机号，多个以逗号隔开，字符串 以Json格式传输
     * @param string $templateParas;短信模板参数，字符串，多个是以JSON字符串组成
     * @param string $SignName;签名名称，默认配置文件获取，字符串
     * @param string $templateId;短信模板ID，默认配置文件获取
     * @param string $sender;短信配置,默认配置文件获取  /国内短信或国际/港澳台 短信通道号，签名管理-》通道号
     * @param string $callback_url;短信配置,默认配置文件获取
     * @param int $sendDataLimit;短信配置,默认配置文件获取
     * @param int $is_use_template;是否使用全变量短信模板（免模板）：0为否，1为是
     * @param int $is_send_sms;是否发送短信 0否(模拟发送，实际不发送短信)，1是
     * @param string $extend;扩展参数，在状态报告中会原样返回
     * 推广短信发送时间为每日8:00 - 21:00，夜间无法发送，避免用户投诉
     * 目前发送分批发送，第一个短信模板ID为无变量，参数传为空，第二个短信模板ID有变量，参数传为实际短信内容，第一个号码发送失败，第二个成功
     * 目前发送分批发送，全部短信模板ID为无变量，参数传为空字符串，可以发送成功
     * @return array
     */
    public static function sendHuaWeiBatchSms($phone,$templateParas,$SignName="",$templateId='',$sender="",$callback_url="",$is_use_template=1,$is_send_sms=1,$extend="999jin")
    {
        $config=config();
        $conf=[];
        if(isset($config['sms'])&&$config['sms']){
            $conf=$config['sms'];
        }
        //发送华为云短信API接口日志
        $send_hua_wei_yun_sms_api_log=[];
        //日志记录，预先记录下请求数据
        $send_hua_wei_yun_sms_api_log['sms_phone']=$phone;
        $send_hua_wei_yun_sms_api_log['sms_templateParas']=$templateParas;
        $send_hua_wei_yun_sms_api_log['sms_SignName']=$SignName;
        $send_hua_wei_yun_sms_api_log['sms_templateId']=$templateId;
        $send_hua_wei_yun_sms_api_log['sms_sender']=$sender;
        $send_hua_wei_yun_sms_api_log['sms_callback_url']=$callback_url;
        $send_hua_wei_yun_sms_api_log['sms_is_use_template']=$is_use_template;
        $send_hua_wei_yun_sms_api_log['sms_is_send_sms']=$is_send_sms;
        $send_hua_wei_yun_sms_api_log['sms_extend']=$extend;

        if(empty($conf)){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数conf"];
        }
        //获取华为云配置信息
        if(empty($conf['hua_wei_sms_channel'])||isset($conf['hua_wei_sms_channel'])&&!$conf['hua_wei_sms_channel']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数hua_wei_sms_channel"];
        }
        $hua_wei_sms_channel=$conf['hua_wei_sms_channel'];

        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_channel_conf']=$hua_wei_sms_channel;//配置文件的华为云短信通道配置参数
        //获取华为云各个商户号的短信配置信息
        // app_key
        if(empty($hua_wei_sms_channel['app_key'])||isset($hua_wei_sms_channel['app_key'])&&!$hua_wei_sms_channel['app_key']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_key"];
        }
        $APP_Key=$hua_wei_sms_channel['app_key'];
        // app_secret
        if(empty($hua_wei_sms_channel['app_secret'])||isset($hua_wei_sms_channel['app_secret'])&&!$hua_wei_sms_channel['app_secret']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_secret"];
        }
        $APP_Secret=$hua_wei_sms_channel['app_secret'];
        // app_url
        if(empty($hua_wei_sms_channel['app_url'])||isset($hua_wei_sms_channel['app_url'])&&!$hua_wei_sms_channel['app_url']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_url"];
        }
        // app_url_Batch
        if(empty($hua_wei_sms_channel['app_url_batch_reply'])||isset($hua_wei_sms_channel['app_url_batch_reply'])&&!$hua_wei_sms_channel['app_url_batch_reply']){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数app_url_batch_reply"];
        }
        $send_url=$hua_wei_sms_channel['app_url'].$hua_wei_sms_channel['app_url_batch_reply'];
        //发送短信各种参数
        //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称  国际/港澳台短信不用关注该参数
//          $senderName = '中国燃气'; // 签名名称
        if(empty($SignName)){
            if(empty($hua_wei_sms_channel['sms_sign_name'])||isset($hua_wei_sms_channel['sms_sign_name'])&&!$hua_wei_sms_channel['sms_sign_name']){
                return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_sign_name"];
            }
            $SignName=$hua_wei_sms_channel['sms_sign_name'];
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_SignName']=$SignName;
        //短信号码 ：以Json格式传输
        //$phone='[["18124029747"],["18124024969"]]';
        if(empty($phone)){
            return ['code'=>403,'msg'=>"短信号码缺失"];
        }
        $phone_arr=explode(',',$phone);
        if(count($phone_arr)>1000){
            return ['code'=>403,'msg'=>"接口对接API平台短信配置限制最多只能批量发送1000条"];
        }
        $phoneArray=self::isJsonBool($phone);//以Json格式传输
        if(empty($phoneArray)){
            return ['code'=>403,'msg'=>"短信号码参数格式错误"];
        }
        $phone_len=count($phoneArray);//号码长度
        $all_phone_len=0;//计算所有的JSON里面电话号码的长度
        //是否使用全变量短信模板（免模板）：0为否，1为是
        if($is_use_template){
            //模板变量 ：以Json格式传输
            if(empty($templateParas)){
                return ['code'=>403,'msg'=>"短信内容参数错误"];
            }
//          $templateParas='[["00369751","众云短信测试"],["众云短信测试.".'.date('Y-m-d H:i:s').']]';
            $templateParasArray=self::isJsonBool($templateParas);//以Json格式传输
            if(empty($templateParasArray)){
                return ['code'=>403,'msg'=>"短信内容参数格式错误"];
            }
            $templateParas_len=count($templateParasArray);
            //验证长度
            if($phone_len!=$templateParas_len){
                return ['code'=>403,'msg'=>"短信内容格式长度错误"];
            }
            //重组 smsContent格式数据
            $smsContent=[];// smsContent,不携带签名名称时,signature请填'' ,必填,请根据模板ID数量灵活增减
            for ($i=0;$i<$phone_len;$i++){
                $phoneChild=$phoneArray[$i];
                $all_phone_len+=count($phoneChild);
                $sms_content_body=$templateParasArray[$i];
                if(empty($sms_content_body)){
                    return ['code'=>403,'msg'=>"短信内容不能为空"];
                }
                if(!is_string($sms_content_body)){
                    $sms_content_body=implode(',',$sms_content_body);
                }
                $body = '【' . $SignName . '】' . $sms_content_body;
                //要有签名，如若签名为空的话，不然显示发送成功，后台还是发送失败
                $smsContentStrChild=self::initDiffSmsBatch($phoneChild,$body);
                $smsContent[$i]=$smsContentStrChild;
            }
        }else{
            // 官方文档对接方式
            // 使用需短信模板ID,多个以逗号隔开
//            $templateId = '5429803977644748b83a7b3302640a9f,5429803977644748b83a7b3302640a9f,5429803977644748b83a7b3302640a9f'; //短信模板ID  5429803977644748b83a7b3302640a9f
            if(empty($templateId)){
                if(empty($hua_wei_sms_channel['sms_template_id'])||isset($hua_wei_sms_channel['sms_template_id'])&&!$hua_wei_sms_channel['sms_template_id']){
                    return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_template_id"];
                }
                $templateId=$hua_wei_sms_channel['sms_template_id'];
            }
            //日志记录
            $send_hua_wei_yun_sms_api_log['sms_templateId']=$templateId;
            $templateArray=explode(',',$templateId);
            //计算当前使用多少个短信模板
            $templateId_len=count($templateArray);
            //验证长度
            if($templateId_len!=$phone_len){
                return ['code'=>403,'msg'=>"短信参数格式长度错误"];
            }
            //模板变量 ：以Json格式传输
            if($templateParas){ // 可以支持无变量的数据
//                $templateParas='[["00369751","众云短信测试"],["众云短信测试.".'.date('Y-m-d H:i:s').']]';
                $templateParasArray=self::isJsonBool($templateParas);//以Json格式传输
                if(empty($templateParasArray)){
                    return ['code'=>403,'msg'=>"短信模板参数格式错误"];
                }
                $templateParas_len=count($templateParasArray);
                //验证长度
                if($phone_len!=$templateParas_len){
                    return ['code'=>403,'msg'=>"短信参数格式长度错误"];
                }
            }
            //重组 smsContent格式数据
            $smsContent=[];// smsContent,不携带签名名称时,signature请填'' ,必填,请根据模板ID数量灵活增减
            for ($i=0;$i<$templateId_len;$i++){
                $phoneChild=$phoneArray[$i];
                $all_phone_len+=count($phoneChild);
                $templateChild=$templateArray[$i];
                $templateParasChild=[];
                if($templateParas){
                    $templateParasChild=$templateParasArray[$i];
                }
                //要有签名，如若签名为空的话，不然显示发送成功，后台还是发送失败
                $smsContentStrChild=self::initDiffSms($phoneChild,$templateChild,$templateParasChild,$SignName);
                $smsContent[$i]=$smsContentStrChild;
            }
        }
        //JSON格式的号码，里面总的号码长度
        if($all_phone_len>1000){
            return ['code'=>403,'msg'=>"接口对接API平台短信配置限制最多只能批量发送1000条"];
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_phone']=$phone;//不重复手机号码的数据，多个以逗号隔开的字符串
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_templateParas']=$templateParas;
        //国内短信或国际/港澳台 短信通道号，签名管理-》通道号
//        $sender = '8820122408650';
        if(empty($sender)){
            if(empty($hua_wei_sms_channel['sms_sender'])||isset($hua_wei_sms_channel['sms_sender'])&&!$hua_wei_sms_channel['sms_sender']){
                return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_sender"];
            }
            $sender=$hua_wei_sms_channel['sms_sender'];
        }
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_sender']=$sender;
        //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
        // 未设置该字段，则短信平台收到运营商短信中心返回的状态报告不会推送给客户，该状态报告将在短信平台中保存1个小时，超时后系统会自动删除
        if(empty($callback_url)){
            if(isset($hua_wei_sms_channel['sms_callback_url'])&&$hua_wei_sms_channel['sms_callback_url']){
                $callback_url=$hua_wei_sms_channel['sms_callback_url'];
            }else{
                return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_callback_url"];
            }
        }
        $statusCallback = $callback_url;// http://my.com/receiveSMSReport
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_callback_url']=$statusCallback;
        //日志记录
        $send_hua_wei_yun_sms_api_log['sms_extend']=$extend;
        //扩展字段必须携带，不然上下行接口返回数据就会缺少返回字段
        if(empty($extend)){
            return ['code'=>403,'msg'=>"接口对接API平台缺少相关配置参数sms_extend"];
        }
        //模拟发送，实际不发送短信
        if($is_send_sms==0){
            $aliYunRes = ['code'=>200,'data'=>[],'msg'=>'模拟短信发送成功!'];
            return $aliYunRes;
        }
        //请求Headers
        $headers = [
            'Content-Type: application/json',
            'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"',
            'X-WSSE: ' . self::buildWsseHeader($APP_Key, $APP_Secret)
        ];
        //请求Body
        $send_data=[
            'from' => $sender,
            'statusCallback' => $statusCallback,
            'smsContent' => $smsContent, // 发送的通知短信内容，短信内容不能超过64KB。
            'extend' => $extend //扩展参数，在状态报告中会原样返回
        ];
        $data = json_encode($send_data);
        //构造发送请求数据
        $context_options = [
            'http' => [
                'method' => 'POST',
                'header'=> $headers,
                'content' => $data,
                'ignore_errors' => true
            ],
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false
            ] //为防止因HTTPS证书认证失败造成API调用失败，需要先忽略证书信任问题
        ];
        //请求发送数据    print_r($context_options) . PHP_EOL; //打印请求信息
        $response = file_get_contents($send_url, false, stream_context_create($context_options));
        if(empty($response)){
            return ['code'=>403,'msg'=>"短信接口异常，请重试"];
        }
        /**     //发送成功返回如下格式数据
        Array
        (
            [result] => Array
            (
                [0] => Array
                    (
                    [originTo] => 18124029747
                    [createTime] => 2020-12-30T09:12:46Z
                    [from] => 8820122408650
                    [smsMsgId] => 995c9981-e5cf-425c-b42a-3f50cdbed485_11245726820
                    [status] => 000000
                    )

                [1] => Array
                    (
                    [originTo] => 18124024969
                    [createTime] => 2020-12-30T09:12:46Z
                    [from] => 8820122408650
                    [smsMsgId] => 995c9981-e5cf-425c-b42a-3f50cdbed485_11245726821
                    [status] => 000000
                    )
            )
        [code] => 000000
        [description] => Success
        )
         */
        try {
            $isJsonBoolResponse=self::isJsonBool($response);
            if(empty($isJsonBoolResponse)){
                return ['code'=>403,'msg'=>"数据格式错误"];
            }
            $response=json_decode($response,true);
            if(isset($response['code'])&&$response['code']=="000000"){
                $aliYunRes = ['code'=>200,'data'=>$response['result'],'msg'=>'接收成功'];
            }else{
                $aliYunRes = ['code'=>403,'data'=>$response,'msg'=>'接收失败'];
            }
            return $aliYunRes;
        } catch (\Exception $e) {
            if($e->getMessage()){
                return ['code'=>403,'msg'=>"短信接口发送异常".$e->getMessage()."，请重试"];
            }else{
                return ['code'=>403,'msg'=>"短信接口发送异常，请重试"];
            }
        }
    }

    /**
     * 构造smsContent参数值
     * @param array $receiver
     * @param string $body
     * @return string[]
     */
    public static  function initDiffSmsBatch($receiver,$body) {
//    return ['to' => $receiver, 'body' => utf8_encode($body)];
        return ['to' => $receiver, 'body' => $body];//此处打印出来，需要是一句完整的短信内容，不能为乱码参数，否则对接成功，短信发送失败
    }

    /**
     * 构造smsContent参数值
     *
     * @param array $receiver
     * @param string $templateId
     * @param array $templateParas
     * @param string $signature | 签名名称,使用国内短信通用模板时填写
     * @return string[]
     */
    public static function initDiffSms($receiver,$templateId,$templateParas,$signature) {
        if (null != $signature && strlen($signature) > 0) {
            return ['to' => $receiver, 'templateId' => $templateId, 'templateParas' => $templateParas, 'signature' => $signature];
        }
        return ['to' => $receiver, 'templateId' => $templateId, 'templateParas' => $templateParas];
    }

    /**
     * 构造X-WSSE参数值
     * @param string $appKey
     * @param string $appSecret
     * @return string
     */
    public static function buildWsseHeader($appKey,$appSecret){
        date_default_timezone_set('Asia/Shanghai');
        $now = date('Y-m-d\TH:i:s\Z'); //Created
        $nonce = uniqid(); //Nonce
        $base64 = base64_encode(hash('sha256', ($nonce . $now . $appSecret))); //PasswordDigest
        return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"",
            $appKey, $base64, $nonce, $now);
    }
    /**
     * @param string $data
     * @param bool $assoc
     * @return bool|mixed|string
     * 判断该字符串是否为 Json格式
     */
    public static function isJsonBool($data = '', $assoc = false){
        $data = json_decode($data, $assoc);
        if (($data && is_object($data)) || (is_array($data) && !empty($data))) {
            return $data;
        }
        return false;
    }
}